<?php
namespace Models;

class Database
{
	// Återanvänd ett objekt för varje instans av Database
	private $_mysqli = NULL;
	
	/**
	 * Ansluter till en Databas
	 * @param $config DBConfig konfigurationsfil med anslutningsuppgifter
	 * @return Boolean
	 */
	public function Connect(\Models\DBConfig $config)
	{
		$this->_mysqli = new \mysqli($config->m_host, $config->m_user, $config->m_password, $config->m_db);
		
		// Vid anslutningsfel
		if ($this->_mysqli->connect_error)
		    return false;
		
		// Sätt rätt teckenuppsättning
		$this->_mysqli->set_charset("utf8");
		
		return true;
	}
	
	
	public function ConnectTest(\Models\DBConfigTest $config)
	{
		$this->_mysqli = new \mysqli($config->m_host, $config->m_user, $config->m_password, $config->m_db);
		
		// Vid anslutningsfel
		if ($this->_mysqli->connect_error)
		    return false;
		
		// Sätt rätt teckenuppsättning
		$this->_mysqli->set_charset("utf8");
		
		return true;
	}
	
	/**
	 * Väljer ett värde från en query
	 * @param $query String Query med en utgående parameter 
	 * @return $returnParam
	 */
	public function SelectOne($query)
	{
		// Preparerar queryn för att skydda mot SQL-injections
		$statement = $this->_mysqli->prepare($query);
		
		if ($statement === FALSE)
			throw new \Exception($this->_mysqli->error);
		
		// Kör preparerat statement
		if ($statement->execute() == FALSE)
			throw new \Exception($this->_mysqli->error);
		
		$returnParam = 0;
		
		// Bind $returnParam till statement så värdet erhålls när vi kör fetch()
		if ($statement->bind_result($returnParam) == FALSE)
			throw new \Exception($this->_mysqli->error);
		
		// Hämtar resultat till bunden variabel
		$statement->fetch();
		
		// Stänger preparerat statement
		$statement->close();
		
		// Returnera resultatet
		return $returnParam;
	}
	
	/**
	 * Hämtar flera rader ur en DB
	 * @param $query string 
	 * @return $statement Preparerad query
	 */
	public function Select($query)
	{
		// Preparerar queryn för att skydda mot SQL-injections
		$statement = $this->_mysqli->prepare($query);
		
		if ($statement === FALSE)
			throw new \Exception($this->_mysqli->error);
		
		// Kör preparerat statement
		if ($statement->execute() == FALSE)
			throw new \Exception($this->_mysqli->error);
		
		return $statement;
	}
	
	
	/**
	 * Preparerar en Query
	 * @param $sql String
	 * @return $statement mysqli_stmt 
	 */
	public function Prepare($query)
	{
		$statement = $this->_mysqli->prepare($query);
		
		// Om fel uppstod
		if ($statement == false)
			throw new \Exception($this->_mysqli->error);
		
		return $statement;
	}
	
	/**
	 * Kör en SQL insert query
	 * @param $statement mysqli_stmt 
	 * @return $insertID integer   
	 */
	public function Insert(\mysqli_stmt $statement)
	{
		// Exekvera statement
		if ($statement->execute() == false)
			throw new \Exception($this->_mysqli->error);
		
		// Spara primärnyckel
		$insertID = $statement->insert_id;
		
		// Stäng statement
		$statement->close();
		
		return $insertID;
	}
	
	/**
	 * Kör en SQL update query
	 * @param $statement mysqli_stmt   
	 * @return bool 
	 */
	public function Update(\mysqli_stmt $statement)
	{
		// Exekvera statement
		if ($statement->execute() == false)
			throw new \Exception($this->_mysqli->error);

		// Stäng statement
		$statement->close();
		
		return true;
	}
	
	/**
	 * Kör en SQL delete query
	 * @param $statement mysqli_stmt 
	 * @return $insertID integer   
	 */
	public function Delete(\mysqli_stmt $statement)
	{
		// Exekvera statement
		if ($statement->execute() == false)
			return false;
			//throw new \Exception($this->mysqli->error);
		
		// Stäng statement
		$statement->close();
		
		return true;
	}
	
	/**
	 * Stänger en Databasanslutning
	 * @return boolean
	 */
	public function Close()
	{
		return $this->_mysqli->close();
	}
	
	/**
	 * Kontrollerar om det finns en kopia av en rad i en tabell i DB
	 * @param $table string
	 * @param $field string Fält/kolumn
	 * @param $value string
	 * @return bool
	 */
	public function alreadyExists($table,$field,$value)
	{
		$sql = "SELECT COUNT(*) FROM $table WHERE $field='$value'";
		
		if($this->SelectOne($sql) > 0)
			return true;
		else
			return false;
	}
}
?>